RxJS
裡一個相當有用的operator
~tap
。☕scan
很盡責的在每個步驟,回報對應的值吧,tap
能協助我們在pipe
的每個步驟之間,顯示值的變化情形,方便你debug,加速建立整個流程。tap
要說的東西不少,我們分為上、下集來進行。tap
吃進什麼資料,就會如實的吐出來,因此最常被使用來debug
。side effect
的設計,例如:當某一個值>3,發出alert,這樣更能讓每個operator
各司其職,專注各自的工作。import { from, map, tap } from 'rxjs';
// case1: tap() basic
console.log('=== case1: tap() basic ===');
from([1, 2, 3, 4, 5])
.pipe(
tap((val) => console.log('[tap]:', val)), //<-- 放一個tap觀察點在此
map((val) => val * 10)
)
.subscribe(console.log);
tap
進行觀察,就能如期地得到當下的資訊。// case2: test to modify stream value in tap()
console.log('=== case2: test to modify stream value in tap() ===');
from([1, 2, 3, 4, 5])
.pipe(
tap((val) => {
return val + 999; //<-- 在tap修改值並不會有任何作用
}),
map((val) => val * 10)
)
.subscribe(console.log);
tap
不允許我們隨意更動stream的值
tap
官網的定義有個有趣的地方,括號內的第一個參數是observerOrNext
,而另外兩個則為error
及complete
。observerOrNext
: 代表著:
- 如果我們給予一個
callback func
,那它會認定是tap
的next()
- 如果是一個
observer object
,就會認定為是tap
的observer
。
error
及complete
,簡單來說,你可以在這兩個參數的位置定義callback func
,不過我們還是習慣一口氣把observer
定義好,這也是為什麼RxJS
也準備在v8
把它丟掉啦!import { from, map, tap } from 'rxjs';
// case3: tap(observer)
console.log('=== case3: tap(observer) ===');
// 定義tap的observer
const observer = {
next: (val) => console.log('tap next:', val),
error: (err) => console.log('tap error:', err),
complete: () => console.log('tap complete'),
};
from([1, 2, 3, 4, 5])
.pipe(
tap(observer), //<-- 放入observer,當偵測到沒有 streaming時,在此呼叫tap complete
map((val) => val * 10)
)
.subscribe(console.log);
observer
給tap
,當偵測到沒有 streaming時,在此呼叫tap completetap
可以讓我們在pipe
的任何位置擷取當前資料流的結果,協助debug
作業。
tap(nextFunc)
: 若輸入為一個函示,則會自動地以它當作next callback func
tap(observer)
: 若輸入為一個observer
,則會自動的套用next
、error
及complete
對應的callback func
。
第15天順利完成,成功沒有途徑,一點一滴累積,你就是專家!